// 做axios的初始化操作
import axios from "axios";
import storage from "./storage.js";
import config from '../config/index.js'
// 定义常量，不变的字符串（如果数量多，新建js去管理）
const TOKEN_ERROR = '认证失败或者token过期'
const NETWORK_ERROR = '请求超时,请检查你的网络配置'

const service = axios.create({
    // baseURL: 'http://localhost:3000/api',
    baseURL: config.baseUrl,
    timeout: 8000,
})

// get post
// 重要功能:拦截器  interceptor
// 作用：把请求 和响应 拆分更加细致，为了给程序员添加操作的机会
// 使用场景：在请求拦截的过程中添加token
//           在响应拦截的过程中统一拦截错误处理
// 怎么操作
// 添加一个请求拦截器
service.interceptors.request.use((config) => {
    // config 请求配置
    // 注意一定有返回，请求才能正常进行 config.headers
    let headers = config.headers
    const { token } = storage.getItem('userInfo')
    // 判断这个请求头有没有，没有就添加上去
    if (!headers.Authorization) {
        headers.Authorization = "Bearer " + token
    }
    return config
})

// 添加一个响应拦截器
service.interceptors.response.use((res) => {
    // res 请求响应内容
    // 响应拦截处理
    const { code, data, msg } = res.data
    if (code === 200) {
        // 如果code成功 直接返回数据到客户端即可
        return data
    } else if (code === 40001) {
        // 错误提示
        console.log(TOKEN_ERROR);
        // 返回一个，外面可以捕获错误的对象
        // 所以要返回一个promise的错误对象
        return Promise.reject(TOKEN_ERROR)
    } else {
        // 如果进入该分支，说明没有code
        // 请求超过我们的timeout
        console.log(NETWORK_ERROR);
        return Promise.reject(NETWORK_ERROR)
    }
})
// 封装各类请求
// get post 两个参数
function request (options) {
    // options 是将来使用过程中传递的具体配置
    // 如果是post
    options.method = options.method || 'get'
    // get params  post data
    if (options.method === 'get') {
        options.params = options.data
    }
    return service(options)
}

const requestList = ['get', 'post']

requestList.forEach((ele) => {
    request[ele] = (url, data, options) => {
        return request({
            url,
            data,
            method: ele,
            ...options,
        })
    }
    // console.log(request.prototype);
})
export default request